/*
 * Paciente.cpp
 *
 *  Created on: 20/08/2012
 *      Author: Manoela Camila
 */

#include "Paciente.h"

/*váriavel global que gera os códigos*/
int cod = 0;

/*Construtor sem parâmetros*/
Paciente::Paciente(){
}

/*método construtor com parâmetros*/
Paciente::Paciente(string nome, Data dataNasc) :nome(nome){
	dataNascimento = dataNasc;
	codigo = cod++;
}

/*Método destrutor*/
Paciente::~Paciente(){}

/*retorna o código do paciente*/
int Paciente::getCodigo() const{

	return codigo;
}

/*Construtor de Cópia*/
Paciente::Paciente(const Paciente &pac){

	codigo = pac.codigo;
	nome = pac.nome;
	dataNascimento = pac.dataNascimento;
	carteira = pac.carteira;
	agenda = pac.agenda;
}

/*Retorna o nome do paciente*/
string Paciente::getNome() const{

	return nome;
}

/*método que calcula e retorna a idade do paciente*/
int Paciente::getIdade() const{

	int dia, mes, ano, diaS, mesS, anoS;

	/*pega a data de nascimento*/
	dia = dataNascimento.getDia();
	mes = dataNascimento.getMesN();
	ano = dataNascimento.getAno();

	/*pega a data do sistema*/
	diaS = dataNascimento.getDataSistema().getDia();
	mesS = dataNascimento.getDataSistema().getMesN();
	anoS = dataNascimento.getDataSistema().getAno();

	/*calcula a idade*/
	if (anoS == ano)
		return 0;
	else
		if (mes < mesS)
			return (anoS - ano);
		else if (mes > mesS)
			return (anoS - ano - 1);
		else
			if (dia <= diaS)
				return (anoS - ano);
			else
				return (anoS - ano - 1);
}

/*Adciona um novo paciente*/
int Paciente::adicionarPaciente(){

	int confirma = 0;

	cout << "Informe o Nome do Paciente:" << endl;
	cin >> nome;
	cout << "Informe a data de Nascimento:" << endl;
	cin >> dataNascimento;

	while (confirma != 1 && confirma != 2){
		cout << "Confirma dados e cadastro? 1 - Sim     2 - Não" << endl;
		cin >> confirma;
		if (confirma == 1){
			cod++;
			codigo = cod;
			return 1;
		} else if (confirma != 2)
			cout << "Opção Inválida" << endl;
	}
	return 0;
}

/*exclui um paciente da lista*/
int Paciente::excluirPaciente(){

	int opcao = 0;

	while (opcao != 1 && opcao != 2){
		cout << "Certeza que deseja excluir esse Paciente? 1 - Sim	2 - Nao" << endl << endl;
		cout << "Código: " << codigo << endl << "Nome: " << nome << "   Data de Nascimento: " << dataNascimento << endl << endl;
		cin >> opcao;
		if (opcao == 1)
			return 1;
	}
	return 0;
}

/*consulta um paciente na lista*/
void Paciente::consultarPaciente(){
	cout << "Codigo: " << codigo << endl << "Nome: " << nome << "	Data Nascimento: " << dataNascimento.getData() << endl;
	carteira.consultarCarteira();
	cout << endl;
	//cout << "Agenda\n" << agenda << endl;
}

/*altera um paciente*/
void Paciente::alterarPaciente(string name, Data dataNasc){

	nome = name;
	dataNascimento = dataNasc;
}

/*altera um paciente sem parâmetros*/
void Paciente::alterarPaciente(){

	cout << "Informe o novo nome" << endl;
	cin >> nome;
	cout << "informe a data de Nascimento" << endl;
	cin >> dataNascimento;
}

Carteira Paciente::getCarteira(){
    return carteira;
}

Agenda Paciente::getAgenda(){
    return agenda;
}

/*sobrecarga do operador de fluxo << - cout*/
ostream &operator<<(ostream &o, Paciente &pac){

	o << pac.codigo << endl;
	o << pac.nome << endl;
	o << pac.dataNascimento.getData() << endl;
	o << pac.carteira;
	o << pac.agenda << endl;

	return o;

}

/*sobrecarga do operador de fluxo >> - cin*/
istream &operator>>(istream &o, Paciente &pac){
	o >> pac.codigo;
	o >> pac.nome;
	o >> pac.dataNascimento;
	o >> pac.carteira;
	o >> pac.agenda;

	return o;
}

/*Sobrecarga operador de igualdade*/
bool Paciente::operator==(const Paciente &pac){

	if (codigo == pac.codigo) //como o código eh unico basta procurar pelo código
		return true;
	return false;
}

/*Sobrecarga operador de desigualdade*/
bool Paciente::operator!=(const Paciente &pac){

	if (codigo != pac.codigo) //como o código eh unico basta procurar pelo código
		return true;
	return false;
}

Data Paciente::getDataNascimento(){
	return dataNascimento;
}
